#include "tlv.h"

int tlv_create(tlv_msg_t *msg, tlv_type_t type, int length, const char *value)
{
    // 参数检查
    if (msg == NULL || value == NULL || length < 0 || length > 4096)
    {
        return -1;
    }

    // 构建请求头
    msg->hdr.type = type;
    msg->hdr.length = length;
    // 构建请求内容
    bzero(msg->value, sizeof(msg->value));
    memcpy(msg->value, value, length);

    return 0;
}

int tlv_recv(int netfd, tlv_msg_t *msg)
{
    // 参数检查
    if (netfd < 0 || msg == NULL)
    {
        return -1;
    }

    // 接收请求头
    int sret = recv(netfd, &msg->hdr, sizeof(tlv_hdr_t), MSG_WAITALL);
    // 断连检查
    if (sret == 0)
    {
        // 用户端关闭连接
        return 1;
    }
    // 接收请求内容
    sret = recv(netfd, msg->value, msg->hdr.length, MSG_WAITALL);
    // 断连检查
    if (sret == 0)
    {
        // 用户端关闭连接
        return 1;
    }

    return 0;
}

int tlv_send(int netfd, const tlv_msg_t *msg)
{
    // 参数检查
    if (netfd < 0 || msg == NULL)
    {
        return -1;
    }

    // 发送请求头
    int sret = send(netfd, &msg->hdr, sizeof(tlv_hdr_t), MSG_NOSIGNAL);
    // 断连检查
    if (sret == -1)
    {
        return 1;
    }

    // 发送请求内容
    sret = send(netfd, msg->value, msg->hdr.length, MSG_NOSIGNAL);
    if (sret == -1)
    {
        return 1;
    }

    return 0;
}